home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 001 / _basicaof / Examples / !Wallpaper / c / WallP_wimp
Text File  |  1994-01-03  |  8KB  |  234 lines

  1. #include <stdlib.h>
  2. #include "wimp.h"
  3. #include "wimpt.h"
  4. #include "win.h"
  5. #include "event.h"
  6. #include "baricon.h"
  7. #include "sprite.h"
  8. #include "werr.h"
  9. #include "res.h"
  10. #include "resspr.h"
  11. #include "flex.h"
  12. #include "template.h"
  13. #include "bbc.h"
  14. #include "colourtran.h"
  15. #include "os.h"
  16. #include "dbox.h"
  17. #include "saveas.h"
  18. #include "Wallpaper.h"  /* constants and external declarations of assembler function */
  19.  
  20. enum iconbar_menu_entries
  21. {
  22.         iconbar_Info = 1,
  23.         iconbar_Save,
  24.         iconbar_Freeze,
  25.         iconbar_Quit
  26. };
  27.  
  28. static spr_details my_sprite;           /* Sprite in which to render    */
  29. static wimp_w displaywin_handle;        /* Window for wallpaper         */
  30. static menu iconbar_menu;               /* Iconbar menu                 */
  31. static BOOL displaying = FALSE;         /* Window on display?           */
  32. static BOOL frozen = FALSE;             /* Window display frozen?       */
  33. static sprite_pixtrans translate[16], *pixtrans;
  34. /*==================================================================*/
  35. static void create_sprite(spr_details *my_sprite)
  36. {
  37.         sprite_ptr ptr;
  38.         if (flex_alloc((flex_ptr)&my_sprite->area, SpriteSize) == 0)
  39.                 werr(TRUE, "Fatal error - failed to allocate store for sprite");
  40.         sprite_area_initialise(my_sprite->area, SpriteSize);
  41.         /* create a sprite within that area */
  42.         wimpt_complain(sprite_create(my_sprite->area, "sprite",
  43.                 sprite_nopalette, SpriteWidth, SpriteHeight, SpriteMode));
  44.         my_sprite->id.tag = sprite_id_name;
  45.         my_sprite->id.s.name = "sprite";
  46.         /* select the sprite and get a pointer to it (faster) */
  47.         wimpt_complain(sprite_select_rp(my_sprite->area, &my_sprite->id, &ptr));
  48.         my_sprite->id.tag = sprite_id_addr;
  49.         my_sprite->id.s.addr = ptr;
  50. }
  51. /*==================================================================*/
  52. static void create_displaywin(wimp_w *handle)
  53. {
  54.         wimp_wind *window;
  55.         /* find template for our window and create a window from it */
  56.         window = template_syshandle("MainWindow");
  57.         wimp_create_wind(window, handle);
  58. }
  59. /*==================================================================*/
  60. static void redo_window(wimp_redrawstr r, BOOL *more)
  61. {
  62.         int sx = SpriteHeight<<2;
  63.         sprite_factors factors;
  64.  
  65.         /* Ask how the WIMP would scale this sprite */
  66.         /* In 4bpp modes pix trans table is not used */
  67.         wimp_readpixtrans(my_sprite.area, &my_sprite.id, &factors, translate);
  68.         while (*more)
  69.         {
  70.                 wimpt_complain(sprite_put_scaled(my_sprite.area, &my_sprite.id, 0,
  71.                         r.box.x0-r.scx, r.box.y1-r.scy-sx, &factors, pixtrans));
  72.                 wimp_get_rectangle(&r, more);
  73.         }
  74. }
  75. /*==================================================================*/
  76. static void redraw_window(wimp_w handle)
  77. {
  78.         BOOL  more;
  79.         wimp_redrawstr r;
  80.         r.w = handle;
  81.         wimp_redraw_wind(&r, &more);
  82.         if (more)  redo_window(r, &more);
  83. }
  84. /*==================================================================*/
  85. static void update_window(void)
  86. {
  87.         wimp_wstate state;
  88.         wimp_redrawstr r;
  89.         BOOL  more;
  90.  
  91.         wimpt_complain(wimp_get_wind_state(displaywin_handle, &state));
  92.         r.w = displaywin_handle;
  93.         r.box.x0 = state.o.x;
  94.         r.box.x1 = state.o.x+(state.o.box.x1-state.o.box.x0);
  95.         r.box.y0 = state.o.y-(state.o.box.y1-state.o.box.y0);
  96.         r.box.y1 = state.o.y;
  97.         wimp_update_wind(&r, &more);
  98.         if (more)  redo_window(r, &more);
  99. }
  100. /*==================================================================*/
  101. static void leftclickproc(wimp_i i)
  102. {
  103.         wimp_wstate state;
  104.         wimp_redrawstr r;
  105.         IGNORE(i);
  106.         if (!displaying)
  107.         {
  108.                 wimpt_noerr(wimp_get_wind_state(displaywin_handle, &state));
  109.                 state.o.behind = -1;            /* open in front */
  110.                 wimp_open_wind(&state.o);
  111.                 r.w = displaywin_handle;        /* force a redraw of the whole window */
  112.                 r.box.x0 = 0;
  113.                 r.box.x1 =  (SpriteWidth <<1);
  114.                 r.box.y0 = -(SpriteHeight<<2);
  115.                 r.box.y1 = 0;
  116.                 wimp_force_redraw(&r);
  117.                 displaying = TRUE;
  118.         }
  119. }
  120. /*==================================================================*/
  121. static void animate_wallpaper()
  122. {
  123.         static size=WALLPAPER_MAXSIZE, d=-1;
  124.         if (size<1 || size>WALLPAPER_MAXSIZE) d=-d;
  125.         size += d;
  126.         Wallpaper( size, my_sprite.id.s.addr);
  127.         update_window();
  128. }
  129. /*==================================================================*/
  130. static void handler(wimp_eventstr *e, void *handle)
  131. {
  132.         handle = handle;
  133.         switch (e->e)
  134.         {
  135.         case wimp_ENULL:
  136.                 if(displaying) animate_wallpaper();
  137.                 break;
  138.         case wimp_EREDRAW:
  139.                 redraw_window(e->data.o.w);
  140.                 break;
  141.         case wimp_EOPEN:
  142.                 wimp_open_wind(&e->data.o);
  143.                 break;
  144.         case wimp_ECLOSE:
  145.                 wimpt_noerr(wimp_close_wind(e->data.o.w));
  146.                 displaying = FALSE;
  147.                 break;
  148.         case wimp_ESEND:
  149.         case wimp_ESENDWANTACK:         /* this code checks for mode/palette broadcasts */
  150.                 switch(e->data.msg.hdr.action)
  151.                 {
  152.                 case wimp_MMODECHANGE:
  153.                         wimpt_checkmode();
  154.                         pixtrans = (wimpt_bpp()==4) ? 0 : translate;
  155.                         /* no break, drops down */
  156.                 case wimp_PALETTECHANGE:
  157.                         wimpt_complain(colourtran_select_table(SpriteMode, 0, -1,
  158.                                 (wimp_paletteword *)-1, translate));
  159.                         break;
  160.                 }
  161.         }
  162. }
  163. /*==================================================================*/
  164. static void info_aboutprog(void)
  165. {
  166.         dbox d = dbox_new("ProgInfo");
  167.         if (d==0) return;
  168.         dbox_show(d);
  169.         dbox_fillin(d);
  170.         dbox_dispose(&d);
  171. }
  172. /*==================================================================*/
  173. static BOOL saver(char *filename, void *handle)
  174. {
  175.         IGNORE(handle);
  176.         return !wimpt_complain(sprite_area_save(my_sprite.area, filename));
  177. }
  178. /*==================================================================*/
  179. static void menuproc(void *handle, char *hit)
  180. {
  181.         IGNORE(handle);
  182.         switch(hit[0])
  183.         {
  184.         case iconbar_Info:
  185.                 info_aboutprog();
  186.                 break;
  187.         case iconbar_Save:
  188.                 saveas(SpriteFile, "Wallpaper", SpriteSize, saver,0,0,0);
  189.                 break;
  190.         case iconbar_Freeze:
  191.                 event_setmask(frozen^=1 ? event_getmask() | wimp_EMNULL :
  192.                                           event_getmask() &~wimp_EMNULL );
  193.                 menu_setflags(iconbar_menu, iconbar_Freeze, frozen, 0);
  194.                 break;
  195.         case iconbar_Quit:
  196.                 exit(0);
  197.                 break;
  198.         }
  199. }
  200. /*==================================================================*/
  201. static void initialise(void)
  202. {
  203.         wimpt_init("Wallpaper");
  204.         res_init("Wallpaper");
  205.         resspr_init();
  206.         flex_init();
  207.         template_init();
  208.         dbox_init();
  209.  
  210.         wimpt_checkmode();
  211.         pixtrans = (wimpt_bpp()==4) ? 0 : translate;
  212.         wimpt_complain(colourtran_select_table(SpriteMode,0,-1,
  213.                 (wimp_paletteword *)-1, translate));
  214.  
  215.         create_sprite(&my_sprite);
  216.         create_displaywin(&displaywin_handle);
  217.         win_register_event_handler(displaywin_handle, handler, 0);
  218.         win_claim_idle_events(displaywin_handle);
  219.         win_claim_unknown_events(displaywin_handle);
  220.  
  221.         baricon("!Wallpaper", 1, leftclickproc);
  222.         iconbar_menu = menu_new("Wallpaper", ">Info,>Save,Freeze,Quit");
  223.         event_attachmenu(win_ICONBAR, iconbar_menu, menuproc, 0);
  224. }
  225. /*==================================================================*/
  226. int main()
  227. {
  228.         initialise();
  229.         event_setmask(wimp_EMPTRENTER | wimp_EMPTRLEAVE);
  230.         for (;;)
  231.                 event_process();
  232. }
  233. /*==================================================================*/
  234.